using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace RPG_The_Game
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        SpriteFont arial;

        Song musica;

        Objetos.Moogle moogle;
        Objetos.Goomba goomba;
        Objetos.Samus samus;
        Objetos.Queijo queijo;

        KeyboardState teclado_atual, teclado_anterior;
        MouseState mouse_atual, mouse_anterior;
        GamePadState joystick_atual, joystick_anterior;

        public enum Cenas
        {

            INTRO, //feito
            JOGO, //feito
            MENU, // feito
            THE_END, //feito
            CREDITOS, //feito
            GAME_OVER //feito

        }

        public Cenas cenaAtual = Cenas.INTRO;

        public RPG_The_Game.Cenas.Cena_Intro cena_intro;
        public RPG_The_Game.Cenas.Cena_Jogo cena_Jogo;
        public RPG_The_Game.Cenas.Cena_Menu cena_menu;
        public RPG_The_Game.Cenas.Cena_Creditos cena_Creditos;
        public RPG_The_Game.Cenas.Cena_END cena_END;
        public RPG_The_Game.Cenas.Cena_OVER cena_OVER;
       
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";           
        }

        protected override void Initialize()
        {

            base.Initialize();
        }

        protected override void LoadContent()
        {

            spriteBatch = new SpriteBatch(GraphicsDevice);

            musica = Content.Load<Song>("Sounds/Musics/Kalimba");

            arial = Content.Load<SpriteFont>("arial");

            MediaPlayer.Play(musica);

            moogle = new Objetos.Moogle(Content.Load<Texture2D>("SHEET_MOOGLE"), Window);

            goomba = new Objetos.Goomba(Content.Load<Texture2D>("SHEET_GOOMBA"), Window);

            samus = new Objetos.Samus(Content.Load<Texture2D>("SHEET_SAMUS"), Window);

            cena_intro = new RPG_The_Game.Cenas.Cena_Intro(Content, Window);
            cena_Jogo = new RPG_The_Game.Cenas.Cena_Jogo(Content, Window);
            cena_menu = new RPG_The_Game.Cenas.Cena_Menu(Content, Window);
            cena_Creditos = new RPG_The_Game.Cenas.Cena_Creditos(Content, Window);
            cena_END = new RPG_The_Game.Cenas.Cena_END(Content, Window);
            cena_OVER = new RPG_The_Game.Cenas.Cena_OVER(Content, Window);

            IsMouseVisible = true;
            Window.Title = "M-G-S The Game (Moogle, Goomba, Samus)";
            //graphics.IsFullScreen = true;
            graphics.PreferredBackBufferWidth = 1000;
            graphics.PreferredBackBufferHeight = 600;
            //graphics.ToggleFullScreen();
            graphics.ApplyChanges();
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            if (teclado_atual.IsKeyDown(Keys.Escape))
                this.Exit();
            if (teclado_atual.IsKeyDown(Keys.Enter) || joystick_atual.IsButtonDown(Buttons.Start))
                cenaAtual = Cenas.MENU;
            if (teclado_atual.IsKeyDown(Keys.J) || joystick_atual.IsButtonDown(Buttons.A))
                cenaAtual = Cenas.JOGO;
            if (teclado_atual.IsKeyDown(Keys.C) || joystick_atual.IsButtonDown(Buttons.Back))
                cenaAtual = Cenas.CREDITOS;

            teclado_atual = Keyboard.GetState();
            mouse_atual = Mouse.GetState();
            joystick_atual = GamePad.GetState(PlayerIndex.One);

            switch (cenaAtual)
            {

                case Cenas.INTRO:
                    cena_intro.Update(gameTime);
                    break;

                case Cenas.JOGO:
                    cena_Jogo.Update(gameTime);
                    break;

                case Cenas.CREDITOS:
                    cena_Creditos.Update(gameTime);
                    break;

                case Cenas.MENU:
                    cena_menu.Update(gameTime);
                    break;

                case Cenas.THE_END:
                    cena_END.Update(gameTime);
                    break;

                case Cenas.GAME_OVER:
                    cena_OVER.Update(gameTime);
                    break;

            }

            if (teclado_atual.IsKeyDown(Keys.Z) && !teclado_anterior.IsKeyDown(Keys.Z))
            {
                queijo = new Objetos.Queijo(Content.Load<Texture2D>("QUEIJO"));
                Objetos.Queijo.listaQueijos.Add(new Objetos.Queijo(Content.Load<Texture2D>("QUEIJO")));
                if (moogle.Bateu(queijo))
                {
                    queijo.visivel = false;
                    cenaAtual = Cenas.THE_END;

                }
            }

            moogle.Update(gameTime, teclado_atual, teclado_anterior, joystick_atual, joystick_anterior);

            if (moogle.Bateu(goomba))
            {

                moogle.visivel = false;
                cenaAtual = Cenas.GAME_OVER;

            }

            if (joystick_atual.ThumbSticks.Right.X == 1)
            {
                moogle.Posicao = Vector2.Zero;
            }

            teclado_anterior = teclado_atual;
            mouse_anterior = mouse_atual;
            joystick_anterior = joystick_atual;

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin(SpriteSortMode.FrontToBack, null);

            switch (cenaAtual)
            {

                case Cenas.INTRO:
                    cena_intro.Draw(gameTime, spriteBatch);
                    break;

                case Cenas.JOGO:
                    moogle.Draw(gameTime, spriteBatch, moogle.andando);
                    goomba.Draw(gameTime, spriteBatch, goomba.andando);
                    samus.Draw(gameTime, spriteBatch, samus.andando);
                    spriteBatch.DrawString(arial, ("      VIDA = " + moogle.vida), new Vector2(100, 10), Color.AntiqueWhite);
                    spriteBatch.DrawString(arial, ("       PONTOS = " + moogle.pontos), new Vector2(300, 10), Color.AntiqueWhite);
                    for (int i = 0; i < Objetos.Queijo.listaQueijos.Count; i++)
                    {
                        Objetos.Queijo.listaQueijos[i].Draw(gameTime, spriteBatch, queijo.andando);
                    }

                    cena_Jogo.Draw(gameTime);
                    break;

                case Cenas.CREDITOS:
                    cena_Creditos.Draw(gameTime, spriteBatch);
                    break;

                case Cenas.MENU:
                    cena_menu.Draw(gameTime, spriteBatch);
                    break;

                case Cenas.THE_END:
                    cena_END.Draw(gameTime, spriteBatch);
                    break;

                case Cenas.GAME_OVER:
                    cena_OVER.Draw(gameTime, spriteBatch);
                    break;

            }

            spriteBatch.End();

            base.Draw(gameTime);
        }

    }

}
